<?php
App::uses('Controller','Controller');
App::uses('Bhu','Lib');
class AdminbaseController extends AppController {

    const ADMIN_USER =  'AdminUser';

    public $components = array('Cookie','Session');

    function beforeFilter() {
        parent::beforeFilter();
        if($_SERVER['SERVER_NAME'] != Configure::read('admin_redirect_domain')){       //如果地址不是后台设置地址，则跳到首页
            $this->redirect('/');
        }
        $user = $this->getUser();                                                      //用getUser的方法获取用户名
        if($this->params['controller'] != 'adminlogin' && empty($user)){               //当输入的地址不是adminlogin或者用户名为空的时候自动跳到adminlogin登录页
            $this->redirect('/adminlogin/');
        }
        $admin_user = $this->getUser();
        $this->set('admin_user',$admin_user);
    }

    function getUser(){
        return $this->Session->read(self::ADMIN_USER);
    }

    function setUser($user){
        return $this->Session->write(self::ADMIN_USER, $user);
    }

    function delUser(){
        return $this->Session->delete(self::ADMIN_USER);
    }
    /*
     * 判断用户是否已经登录 
     * @param     bool    $msg_output    输出错误类型 0：bool 1:json 2:跳转
     * @return bool
     */
    function checkLogin($msg_output=0)
    { 
        $url = "/adminlogin/"; 
        $admin_user = $this->getUser(); 
        if(empty($admin_user))
        {
            if($msg_output==0)
                return false;
            else if($msg_output==1)
                $this->ajaxReturn(4000, '登录已失效',array(),$url);
            else 
                $this->redirect($url); 
        } 
        if($msg_output==0)
            return true; 
    } 




    function upload_img(){
        try {
            $php_path = dirname(dirname(dirname(__FILE__))).'/webroot/';
            //文件保存目录路径
            $save_path = $php_path . '/uploads/attached/';
            //文件保存目录URL
            $save_url = '/uploads/attached/';
            //定义允许上传的文件扩展名
            $ext_arr = array(
                'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
                // 'flash' => array('swf', 'flv'),
                // 'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
                // 'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2'),
            );
            //最大文件大小
            $max_size = 1000000; //1MB
            $save_path = realpath($save_path) . '/';
            //PHP上传失败
            if (!empty($_FILES['imgFile']['error'])) {
                switch($_FILES['imgFile']['error']){
                    case '1':
                        $error = '超过php.ini允许的大小。';
                        break;
                    case '2':
                        $error = '超过表单允许的大小。';
                        break;
                    case '3':
                        $error = '图片只有部分被上传。';
                        break;
                    case '4':
                        $error = '请选择图片。';
                        break;
                    case '6':
                        $error = '找不到临时目录。';
                        break;
                    case '7':
                        $error = '写文件到硬盘出错。';
                        break;
                    case '8':
                        $error = 'File upload stopped by extension。';
                        break;
                    case '999':
                    default:
                        $error = '未知错误。';
                }
                throw new Exception($error);
            }
            if(!empty($_FILES['file_data'])){ //bootstrap-fileinput
                $_FILES['imgFile'] = $_FILES['file_data'];
            }
            //有上传文件时
            if (empty($_FILES) === false) {
                //原文件名
                $file_name = $_FILES['imgFile']['name'];
                //服务器上临时文件名
                $tmp_name = $_FILES['imgFile']['tmp_name'];
                //文件大小
                $file_size = $_FILES['imgFile']['size'];
                //检查文件名
                if (!$file_name) {
                    throw new Exception("请选择文件。");
                }
                //检查目录
                if (@is_dir($save_path) === false) {
                    throw new Exception("上传目录不存在。");
                }
                //检查目录写权限
                if (@is_writable($save_path) === false) {
                    throw new Exception("上传目录没有写权限。");
                }
                //检查是否已上传
                if (@is_uploaded_file($tmp_name) === false) {
                    throw new Exception("上传失败。");
                }
                //检查文件大小
                if ($file_size > $max_size) {
                    throw new Exception("上传文件大小超过限制。");
                }
                //检查目录名
                $dir_name = empty($_GET['dir']) ? 'image' : trim($_GET['dir']);
                if (empty($ext_arr[$dir_name])) {
                    throw new Exception("目录名不正确。");
                }
                //获得文件扩展名
                $temp_arr = explode(".", $file_name);
                $file_ext = array_pop($temp_arr);
                $file_ext = trim($file_ext);
                $file_ext = strtolower($file_ext);
                //检查扩展名
                if (in_array($file_ext, $ext_arr[$dir_name]) === false) {
                    throw new Exception("上传文件扩展名是不允许的扩展名。\n只允许" . implode(",", $ext_arr[$dir_name]) . "格式。");
                }
                //创建文件夹
                if ($dir_name !== '') {
                    $save_path .= $dir_name . "/";
                    $save_url .= $dir_name . "/";
                    if (!file_exists($save_path)) {
                        mkdir($save_path);
                    }
                }
                $ymd = date("Ymd");
                $save_path .= $ymd . "/";
                $save_url .= $ymd . "/";
                if (!file_exists($save_path)) {
                    mkdir($save_path);
                }
                //新文件名
                $new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $file_ext;
                //移动文件
                $file_path = $save_path . $new_file_name;
                if (move_uploaded_file($tmp_name, $file_path) === false) {
                    throw new Exception("上传文件失败。");
                }
                @chmod($file_path, 0644);
                $file_url = $save_url . $new_file_name;
                echo json_encode(array('error' => 0, 'url' => $file_url));
                exit;
            }
        } catch (Exception $e) {
            $error = array('error' => 1, 'message' => $e->getMessage());
            echo json_encode($error);
            exit;
        }
    }

    function file_manager($json = true){
        $php_path = dirname(dirname(dirname(__FILE__))).'/webroot/';
        //根目录路径，可以指定绝对路径，比如 /var/www/attached/
        $root_path = $php_path . '/upload/';
        //根目录URL，可以指定绝对路径，比如 http://www.yoursite.com/attached/
        $root_url = 'http://'.Configure::read('site_name').'/upload/';
        //图片扩展名
        $ext_arr = array('gif', 'jpg', 'jpeg', 'png', 'bmp');

        //目录名
        $dir_name = empty($_GET['dir']) ? '' : trim($_GET['dir']);
        if (!in_array($dir_name, array('', 'image', 'flash', 'media', 'file'))) {
            echo "Invalid Directory name.";
            exit;
        }
        if ($dir_name !== '') {
            $root_path .= $dir_name . "/";
            $root_url .= $dir_name . "/";
            if (!file_exists($root_path)) {
                mkdir($root_path);
            }
        }
        //根据path参数，设置各路径和URL
        if (empty($_GET['path'])) {
            $current_path = realpath($root_path) . '/';
            $current_url = $root_url;
            $current_dir_path = '';
            $moveup_dir_path = '';
        } else {
            $current_path = realpath($root_path) . '/' . $_GET['path'];
            $current_url = $root_url . $_GET['path'];
            $current_dir_path = $_GET['path'];
            $moveup_dir_path = preg_replace('/(.*?)[^\/]+\/$/', '$1', $current_dir_path);
        }
        //echo realpath($root_path);
        //排序形式，name or size or type
        global $order;
        $order = empty($_GET['order']) ? 'name' : strtolower($_GET['order']);

        //不允许使用..移动到上一级目录
        if (preg_match('/\.\./', $current_path)) {
            echo 'Access is not allowed.';
            exit;
        }
        //最后一个字符不是/
        if (!preg_match('/\/$/', $current_path)) {
            echo 'Parameter is not valid.';
            exit;
        }
        //目录不存在或不是目录
        if (!file_exists($current_path) || !is_dir($current_path)) {
            echo 'Directory does not exist.';
            exit;
        }

        //遍历目录取得文件信息
        $file_list = array();
        if ($handle = opendir($current_path)) {
            $i = 0;
            while (false !== ($filename = readdir($handle))) {
                if ($filename{0} == '.') continue;
                $file = $current_path . $filename;
                if (is_dir($file)) {
                    $file_list[$i]['is_dir'] = true; //是否文件夹
                    $file_list[$i]['has_file'] = (count(scandir($file)) > 2); //文件夹是否包含文件
                    $file_list[$i]['filesize'] = 0; //文件大小
                    $file_list[$i]['is_photo'] = false; //是否图片
                    $file_list[$i]['filetype'] = ''; //文件类别，用扩展名判断
                } else {
                    $file_list[$i]['is_dir'] = false;
                    $file_list[$i]['has_file'] = false;
                    $file_list[$i]['filesize'] = filesize($file);
                    $file_list[$i]['dir_path'] = '';
                    $file_ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
                    $file_list[$i]['is_photo'] = in_array($file_ext, $ext_arr);
                    $file_list[$i]['filetype'] = $file_ext;
                }
                $file_list[$i]['filename'] = $filename; //文件名，包含扩展名
                $file_list[$i]['datetime'] = date('Y-m-d H:i:s', filemtime($file)); //文件最后修改时间
                $file_list[$i]['time'] = filemtime($file); //文件最后修改时间
                $i++;
            }
            closedir($handle);
            usort($file_list, function($a, $b){
                global $order;
                if ($a['is_dir'] && !$b['is_dir']) {
                    return -1;
                } else if (!$a['is_dir'] && $b['is_dir']) {
                    return 1;
                } else {
                    if ($order == 'size') {
                        if ($a['filesize'] > $b['filesize']) {
                            return 1;
                        } else if ($a['filesize'] < $b['filesize']) {
                            return -1;
                        } else {
                            return 0;
                        }
                    } else if ($order == 'type') {
                        return strcmp($a['filetype'], $b['filetype']);
                    } else {
                        return strcmp($a['filename'], $b['filename']);
                    }
                }
            });
            $result = array();
            //相对于根目录的上一级目录
            $result['moveup_dir_path'] = $moveup_dir_path;
            //相对于根目录的当前目录
            $result['current_dir_path'] = $current_dir_path;
            //当前目录的URL
            $result['current_url'] = $current_url;
            //文件数
            $result['total_count'] = count($file_list);
            //文件列表数组
            $result['file_list'] = $file_list;
            //输出JSON字符串
            if($json){
                echo json_encode($result);exit();
            }else{
                return $result;
            }
        }
    }

    function bs_upload_img($dir_ymd = 'Ymd'){
        try {
            $php_path = dirname(dirname(dirname(__FILE__))).'/webroot/';
            //文件保存目录路径
            $save_path = $php_path . '/uploads/attached/';
            //文件保存目录URL
            $save_url = '/uploads/attached/';
            //定义允许上传的文件扩展名
            $ext_arr = array(
                'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
                // 'flash' => array('swf', 'flv'),
                // 'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
                // 'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2'),
            );
            //最大文件大小
            $max_size = 1000000; //1MB
            $save_path = realpath($save_path) . '/';
            //PHP上传失败
            if (!empty($_FILES['imgFile']['error'])) {
                switch($_FILES['imgFile']['error']){
                    case '1':
                        $error = '超过php.ini允许的大小。';
                        break;
                    case '2':
                        $error = '超过表单允许的大小。';
                        break;
                    case '3':
                        $error = '图片只有部分被上传。';
                        break;
                    case '4':
                        $error = '请选择图片。';
                        break;
                    case '6':
                        $error = '找不到临时目录。';
                        break;
                    case '7':
                        $error = '写文件到硬盘出错。';
                        break;
                    case '8':
                        $error = 'File upload stopped by extension。';
                        break;
                    case '999':
                    default:
                        $error = '未知错误。';
                }
                throw new Exception($error);
            }
            //有上传文件时
            if (empty($_FILES) === false) {
                //原文件名
                $file_name = $_FILES['file_data']['name'];
                //服务器上临时文件名
                $tmp_name = $_FILES['file_data']['tmp_name'];
                //文件大小
                $file_size = $_FILES['file_data']['size'];
                //检查文件名
                if (!$file_name) {
                    throw new Exception("请选择文件。");
                }
                //检查目录
                if (@is_dir($save_path) === false) {
                    throw new Exception("上传目录不存在。");
                }
                //检查目录写权限
                if (@is_writable($save_path) === false) {
                    throw new Exception("上传目录没有写权限。");
                }
                //检查是否已上传
                if (@is_uploaded_file($tmp_name) === false) {
                    throw new Exception("上传失败。");
                }
                //检查文件大小
                if ($file_size > $max_size) {
                    throw new Exception("上传文件大小超过限制。");
                }
                //检查目录名
                $dir_name = empty($_GET['dir']) ? 'image' : trim($_GET['dir']);
                if (empty($ext_arr[$dir_name])) {
                    throw new Exception("目录名不正确。");
                }
                //获得文件扩展名
                $temp_arr = explode(".", $file_name);
                $file_ext = array_pop($temp_arr);
                $file_ext = trim($file_ext);
                $file_ext = strtolower($file_ext);
                //检查扩展名
                if (in_array($file_ext, $ext_arr[$dir_name]) === false) {
                    throw new Exception("上传文件扩展名是不允许的扩展名。\n只允许" . implode(",", $ext_arr[$dir_name]) . "格式。");
                }
                //创建文件夹
                if ($dir_name !== '') {
                    $save_path .= $dir_name . "/";
                    $save_url .= $dir_name . "/";
                    if (!file_exists($save_path)) {
                        mkdir($save_path);
                    }
                }
                $ymd = date($dir_ymd);
                $save_path .= $ymd . "/";
                $save_url .= $ymd . "/";
                if (!file_exists($save_path)) {
                    mkdir($save_path);
                }
                //新文件名
                $new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $file_ext;
                //移动文件
                $file_path = $save_path . $new_file_name;
                if (move_uploaded_file($tmp_name, $file_path) === false) {
                    throw new Exception("上传文件失败。");
                }
                @chmod($file_path, 0644);
                $file_url = $save_url . $new_file_name;
                echo json_encode(array('url' => $file_url));
                exit;
            }
        } catch (Exception $e) {
            $error = array('error' => $e->getMessage());
            echo json_encode($error);
            exit;
        }
    }

    /** 
     * 通用删除数据 
     * $model_name 模型名称，
     * $where 条件
    */
    function data_delete($model_name, $where = array(), $echo_json = true){
        $this->loadModel($model_name);
        try {
            if(empty($where)){
                throw new Exception("缺少条件");
            }
            foreach ($where as $key => $val) {
                if(empty($val)){
                    throw new Exception("缺少{$key}");
                }
            }
            if(!$this->$model_name->delete($where)){
                throw new Exception("删除失败，请稍后再试！");
            }
            $data['status'] = 'success';
        } catch (Exception $e) {
            $data['status'] = 'fail';
            $data['error'] = $e->getMessage();
        }
        if($echo_json == true){
            echo json_encode($data);die;
        }else{
            return $data;
        }
    }
      /**
     * URL重定向
     * @param string $url 重定向的URL地址
     * @param integer $time 重定向的等待时间（秒）
     * @param string $msg 重定向前的提示信息
     * @return void 
     */
    function admin_redirect($url, $time=0, $msg='', $buttons = []) {
        //多行URL地址支持
        $url        = str_replace(array("\n", "\r"), '', $url);
        if (empty($buttons)) {
            $buttons = [
                "<a href='javascript:history.go(-1)'>返回上一页</a>",
            ];
        }
        if (empty($msg))
            $msg    = "系统将在{$time}秒之后自动跳转！";
        $content = "<div style='text-align: center;'>";
        $content .= "   <p>$msg</p>";
        $content .= "   <p>";
        $content .= implode(" | ", $buttons);
        $content .= "   </p>";
        $content .= "</div>";
        if (!headers_sent()) {
            // redirect
            if (0 === $time) {
                header('Location: ' . $url);
            } else {
                header("refresh:{$time};url={$url}");
                echo $content; 
            }
            exit();
        } else {
            $str    = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
            if ($time != 0) 
                $str .= $content; 
            exit($str);
        }
    }  

}